package com.qf.producer.topic;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

public class ProducerMain {
    public static void main(String[] args) throws IOException, TimeoutException {
        //构建一个连接工厂(配置和rabbitmq的连接信息)
        ConnectionFactory factory = new ConnectionFactory();
        //设置rabbitmq的机器ip
        factory.setHost("localhost");
        //设置rabbitmq运行的端口
        factory.setPort(5672);
        //设置登录用户名
        factory.setUsername("guest");
        //设置登录密码
        factory.setPassword("guest");
        //设置写入数据的虚拟主机
        factory.setVirtualHost("cdm");

        //获取Connection对象
        Connection conn = factory.newConnection();
        //获取channel
        Channel channel = conn.createChannel();

        //利用channel发送消息
        //① 声明两个个队列
        channel.queueDeclare("topic.que1",true,false,false,null);
        channel.queueDeclare("topic.que2",true,false,false,null);

        //② 声明一个交换机
        channel.exchangeDeclare("topic.ex", BuiltinExchangeType.TOPIC,true);

        //③ 绑定交换机和队列的关系  (绑定队列到TOPIC类型的交换机上，必须指定通配符的路由键)
        /*
            * 表示有且仅有一个单词 （必须要有一个单词，而且只能有一个单词）
            # 表示任意多个单词(可以有多个，也可以没有)
         */
        channel.queueBind("topic.que1","topic.ex","routekey.*");
        channel.queueBind("topic.que2","topic.ex","routekey.#");

        //④ 向队列中发送消息
        channel.basicPublish("topic.ex","routekey",null,"我是话题模式的消息1".getBytes(StandardCharsets.UTF_8));
        channel.basicPublish("topic.ex","routekey.b",null,"我是话题模式的消息2".getBytes(StandardCharsets.UTF_8));
        channel.basicPublish("topic.ex","routekey.b.c",null,"我是话题模式的消息3".getBytes(StandardCharsets.UTF_8));

        //释放资源
        channel.close();
        conn.close();
    }
}
